<?php

namespace app\checkin\controller;

use think\admin\Controller;
use think\admin\service\AdminService;

/**
 * 打卡积分基础控制器
 * 实现数据权限过滤
 */
abstract class Base extends Controller
{
    /**
     * 当前登录用户信息
     * @var array
     */
    protected $user;
    
    /**
     * 当前用户的门店ID
     * @var int
     */
    protected $storeId;
    
    /**
     * 当前用户的角色类型
     * @var string
     */
    protected $roleType;
    
    /**
     * 是否是总账号
     * @var bool
     */
    protected $isMaster;
    
    /**
     * 控制器初始化
     */
    protected function initialize()
    {
        parent::initialize();
        
        // 获取当前登录用户信息（库中读取）
        $userId = AdminService::getUserId();
        $user = [];
        if ($userId) {
            try {
                $user = \think\admin\model\SystemUser::mk()->where(['id' => $userId])->findOrEmpty()->toArray();
            } catch (\Throwable $e) {
                $user = [];
            }
        }
        $this->user = $user;

        // 获取用户的门店ID和角色类型
        $this->storeId = intval($this->user['store_id'] ?? 0);
        $this->roleType = strval($this->user['role_type'] ?? ($this->storeId === 0 ? 'master' : 'store'));
        $this->isMaster = ($this->roleType === 'master' || $this->storeId === 0 || AdminService::isSuper());

        // 将用户信息传递给视图
        $this->assign('currentUser', $this->user);
        $this->assign('isMaster', $this->isMaster);
        $this->assign('storeId', $this->storeId);
    }
    
    /**
     * 获取数据权限过滤条件
     * 总账号：不限制，可以看所有数据
     * 分账号：只能看自己门店的数据
     * 
     * @return array
     */
    protected function getStoreWhere(): array
    {
        if ($this->isMaster) {
            // 总账号，不限制
            return [];
        }
        
        // 分账号，只能看自己门店的数据
        return ['store_id' => $this->storeId];
    }
    
    /**
     * 获取会员数据权限过滤条件
     * 会员比较特殊，需要通过会员门店关系表来过滤
     * 
     * @return array
     */
    protected function getMemberWhere(): array
    {
        if ($this->isMaster) {
            // 总账号，不限制
            return [];
        }
        
        // 分账号，需要通过会员门店关系表来过滤
        // 这个在具体的控制器中实现
        return ['store_id' => $this->storeId];
    }
    
    /**
     * 检查是否有权限操作某个门店的数据
     * 
     * @param int $storeId 门店ID
     * @return bool
     */
    protected function checkStorePermission(int $storeId): bool
    {
        if ($this->isMaster) {
            // 总账号，有权限操作所有门店
            return true;
        }
        
        // 分账号，只能操作自己的门店
        return $storeId == $this->storeId;
    }
    
    /**
     * 获取当前用户可访问的门店列表
     * 用于下拉选择等场景
     * 
     * @return array
     */
    protected function getAccessibleStores(): array
    {
        $model = \app\checkin\model\Store::mk();
        
        if ($this->isMaster) {
            // 总账号，返回所有门店
            return $model->where(['status' => 1])->order('sort desc, id asc')->select()->toArray();
        }
        
        // 分账号，只返回自己的门店
        return $model->where(['id' => $this->storeId, 'status' => 1])->select()->toArray();
    }
}

